package com.wanxi.product.service;

import com.wanxi.product.core_sevice.SkuService;
import com.wanxi.product.core_sevice.SpuService;
import com.wanxi.product.service.api.dto.*;
import com.wanxi.product.service.api.query.enterprise.SpuQuery;
import com.wanxi.product.service.api.util.SkuStateEnum;
import com.wanxi.product.service.api.vo.shop.*;
import com.wanxi.product.service.api.query.shop.SkuQueryShop;
import com.wanxi.product.service.api.result.CommonResult;
import com.wanxi.product.service.api.feign.ProductShopService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;

@Api(tags = "店家接口")
@RestController
@RequestMapping("/shop")
public class ProductShopServiceImpl implements ProductShopService {
    @Resource
    SpuService spuService;

    @Resource
    SkuService skuService;

    @Override
    @ApiOperation("获取sku列表")
    @GetMapping("/sku/findAll")
    public CommonResult<List<SkuFindAllOutVo>> findAllSku(SkuQueryShop skuQuery) {
        /*符合条件的sku集合*/
        Set<SkuFindAllOutVo> set = new HashSet<>();

        /*id，名称，市场价，销售价*/
        SkuQueryDto skuQueryDto = SkuQueryDto.builder()
                .skuId(skuQuery.getSkuId())
                .skuName(skuQuery.getSkuName())
                .priceUpper(skuQuery.getMarketPriceUpper())
                .priceLower(skuQuery.getMarketPriceLower())
                .build();

        /*通过分类id查找*/
        if (skuQuery.getTypeId() != null && skuQuery.getTypeId() != 0) {
            SpuQuery spuQuery = SpuQuery.builder()
                    .typeId(skuQuery.getTypeId())
                    .build();
            List<SpuDto> spuDtoList = spuService.findAllSpu(spuQuery);
            for (SpuDto spuDto : spuDtoList) {
                skuQueryDto.setSpuId(spuDto.getSpuId());
                /*分类名称*/
                TypeDto typeDto = spuService.findTypeByTypeId(spuDto.getTypeId());
                List<SkuDto> skuDtoList = skuService.findAllSku(skuQueryDto);
                for (SkuDto skuDto : skuDtoList) {
                    /*销售价*/
                    PriceDto priceDto = skuService.findPriceBySkuId(skuDto.getSkuId());
                    SkuFindAllOutVo skuFindAllOutVo = SkuFindAllOutVo.builder()
                            .skuId(skuDto.getSkuId())
                            .skuName(skuDto.getSkuName())
                            .typeName(typeDto.getTypeName())
                            .img(skuDto.getImg())
                            .salePrice(priceDto.getSalePrice())
                            .marketPrice(skuDto.getMarketPrice())
                            .build();
                    set.add(skuFindAllOutVo);
                }
            }
        } else {
            List<SkuDto> skuDtoList = skuService.findAllSku(skuQueryDto);
            for (SkuDto skuDto : skuDtoList) {
                /*分类名称*/
                SpuDto spuDto = spuService.findSpuBySpuId(skuDto.getSpuId());
                TypeDto typeDto = spuService.findTypeByTypeId(spuDto.getTypeId());
                /*销售价*/
                PriceDto priceDto = skuService.findPriceBySkuId(skuDto.getSkuId());
                SkuFindAllOutVo skuFindAllOutVo = SkuFindAllOutVo.builder()
                        .skuId(skuDto.getSkuId())
                        .skuName(skuDto.getSkuName())
                        .typeName(typeDto.getTypeName())
                        .img(skuDto.getImg())
                        .salePrice(priceDto.getSalePrice())
                        .marketPrice(skuDto.getMarketPrice())
                        .build();
                set.add(skuFindAllOutVo);
            }
        }
        return CommonResult.success(new ArrayList<>(set));
    }

    @Override
    @ApiOperation("根据id查找sku")
    @ApiImplicitParam(name = "skuId", value = "要查询的商品sku的id", dataType = "Long")
    @GetMapping("/sku/findById")
    public CommonResult<SkuFindByIdOutVo> findSkuById(Long skuId) {
        /*名称，图片，市场价，规格，描述，状态*/
        SkuDto skuDto = skuService.findSkuBySkuId(skuId);
        /*分类名称*/
        SpuDto spuDto = spuService.findSpuBySpuId(skuDto.getSpuId());
        TypeDto typeDto = spuService.findTypeByTypeId(spuDto.getTypeId());
        /*销售价*/
        PriceDto priceDto = skuService.findPriceBySkuId(skuId);

        SkuFindByIdOutVo skuFindAllOutVo = SkuFindByIdOutVo.builder()
                .typeName(typeDto.getTypeName())
                .skuName(skuDto.getSkuName())
                .img(skuDto.getImg())
                .marketPrice(skuDto.getMarketPrice())
                .salePrice(priceDto.getSalePrice())
                .specifications(skuDto.getSpecifications())
                .description(skuDto.getDescription())
                .state(skuDto.getState())
                .build();
        return CommonResult.success(skuFindAllOutVo);
    }

    @Override
    @ApiOperation("商品上下架")
    @PutMapping("/sku/shelve")
    public CommonResult skuOnShelvesAndOffShelves(SkuShelvesInVo skuShelvesInVo) {
        SkuDto skuDto = skuService.findSkuBySkuId(skuShelvesInVo.getSkuId());
        if (skuDto.getState() == SkuStateEnum.上架中.getCode()) {
            SkuDto skuUpdateDto = SkuDto.builder()
                    .state(SkuStateEnum.调整中.getCode())
                    .build();
            skuService.updateSku(skuUpdateDto);
        } else if (skuDto.getState() == SkuStateEnum.调整中.getCode()) {
            SkuDto skuUpdateDto = SkuDto.builder()
                    .state(SkuStateEnum.上架中.getCode())
                    .build();
            skuService.updateSku(skuUpdateDto);
        }
        return CommonResult.success();
    }

}
